#pragma once

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QFile>
#include<QMessageBox>
#include<QSqlError>
#include<QApplication>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    DatabaseManager &instance=DatabaseManager::instance();

    instance.init();
    QSqlQuery *query;
    ui->setupUi(this);
    // 设置背景图片
    QPixmap pixmap("登录界面背景图.jpg");
    QPalette palette = this->palette();
    palette.setBrush(QPalette::Window, QBrush(pixmap.scaled(this->size(), Qt::IgnoreAspectRatio)));
    this->setPalette(palette);
    this->setAutoFillBackground(true);  // 必须启用自动填充

    this->setWindowTitle("ECMS登录窗口");
    bool has_next=instance.tableExists("users");
    // 检查表是否存在
    if (has_next==false) {//默认的表为user
        //创建user表
        const QString create_table_str =
            "CREATE TABLE users ("
            "account TEXT PRIMARY KEY NOT NULL,"
            "password TEXT NOT NULL,"
            "privileges TEXT NOT NULL)";
        query=instance.executeQuery(create_table_str);
        if (!query->next()) {
            QMessageBox::warning(nullptr,"提示","未能成功创建数据表，请重新尝试",QMessageBox::Ok);
            qCritical() << "Create table failed:" << query->lastError().text();
        }
        //插入默认用户
        QString insert_sql_query="INSERT INTO users (account, password,privileges) VALUES (:acc, :pwd,:pri)";
        QVariantMap user_map_admin;
        user_map_admin.insert("acc","admin");
        user_map_admin.insert("pwd","admin");
        user_map_admin.insert("pri","管理员");
        QVariantMap user_map_user;
        user_map_user.insert("acc","user");
        user_map_user.insert("pwd","user");
        user_map_user.insert("pri","普通用户");

        // // 删除用户
        // QString delete_sql="DELETE FROM users WHERE account = :acc";
        // QVariantMap delete_user_map_user;
        // delete_user_map_user.insert("acc",account);
        // instance.executeQuery(delete_sql,delete_user_map_user);

        instance.executeQuery(insert_sql_query,user_map_admin)->next()?qDebug()<<"用户插入成功":qDebug()<<"用户插入失败";
        instance.executeQuery(insert_sql_query,user_map_user)->next()?qDebug()<<"用户插入成功":qDebug()<<"用户插入失败";
    }
    connect(ui->Button_login,SIGNAL(pressed()),this,SLOT(btn_try_Login()));
    connect(ui->Button_software_description,SIGNAL(pressed()),this,SLOT(btn_description()));
    connect(ui->Button_exit,SIGNAL(pressed()),this,SLOT(btn_exit()));

}


MainWindow::~MainWindow()
{
    delete ui;
}

///尝试登录
void MainWindow::btn_try_Login()
{
    QSqlQuery *query;
    //获取单例的对象
    DatabaseManager &instance=DatabaseManager::instance();
    //通过验证账号与密码是否相同
    // QPair<bool,QString> result=db_manager->validateCredentials(ui->LineEdit_count->text(),ui->LineEdit_password->text());
    QString account=ui->LineEdit_count->text();
    QString password=ui->LineEdit_password->text();
    if (account.isEmpty() || password.isEmpty()) {
        QMessageBox::warning(nullptr,"登录失败","密码和账户不能为空",QMessageBox::Ok);
        return;
    }

    QString query_account_exit_str="SELECT * FROM users WHERE account = :acc";
    QVariantMap map_account_exits;
    map_account_exits.insert("acc",account);
    //若没有结果，则query.next=>false
    query=instance.executeQuery(query_account_exit_str,map_account_exits);
    if (!query->next()) {
        QMessageBox::warning(nullptr,"登录失败","账户不存在，请重新登录",QMessageBox::Ok);
        return;
    }

    //查询是否存在账户,并返回密码与权限信息
    QString find_count_str= "SELECT password,privileges FROM users WHERE account = :acc";
    query=instance.executeQuery(find_count_str,map_account_exits);
    if (!query->next()) {
        //账户不存在
        QMessageBox::warning(nullptr,"登录失败","数据库未查询成功,账户未找到，请重新登录",QMessageBox::Ok);
        return;
    }
    //数据库返回的密码信息
    const QString storedPassword = query->value(0).toString();
    QString privilege=query->value(1).toString();;
    // 实际使用时应该比较密码哈希值而不是明文
    if (storedPassword != password) {
        //账户与密码不匹配
        QMessageBox::warning(nullptr,"登录失败","账户密码错误，请重新登录",QMessageBox::Ok);
        return;
    }
    QMessageBox::information(nullptr,"登录成功",QString("账户密码匹配,登录成功!\n权限:").append(privilege),QMessageBox::Ok);
    //权限信息

    if(this->work_window==nullptr)
    {
        return;
    }
    //如果登录成功，则键值对的值为value
    work_window->setAttribute(Qt::WA_DeleteOnClose);
    work_window->show();
    work_window->setWindowTitle("能耗管理系统"+QString("[")+privilege+"]");
    //关闭当前窗口
    this->close();
}

void MainWindow::closeEvent(QCloseEvent *event) {
    event->accept(); // 接受关闭事件
    // 检查是否所有顶层窗口都已关闭
    if (QApplication::topLevelWindows().isEmpty()) {
        QApplication::quit(); // 手动退出应用
    }
    // QApplication::quit(); // 手动退出应用
}

///软件介绍
void MainWindow::btn_description()
{
    QMessageBox::information(nullptr,"软件介绍","    能耗管理系统是一款主要应用机械加工设备的软件，在使用前请确保相关物理设备已经成功连接，"
                                                "并且相关预配置文件已经正确被配置，关于预配置文件夹的URL地址，请登录后查看系统配置面板"
                                                "预配置包含接收配置文件和发送配置文件，接收配置文件负责将数据帧中的数据转为有用的信息，"
                                                "发送配置文件则存储了系统运行时自动发送的数据，在运行时系统会依次轮发各选中的发送配置文"
                                                "件中的内容。\n    请确定各端口设备连接后再打开端口，若希望下次系统启动时自动连接上传连接"
                                                "的端口，请勾选“自动打开上次连接的端口”,系统会在下线后保存相关配置，并在下次开启时自动进"
                                                "行连接。\n    打开串口后可以在能耗监控页面查看实时的具体数值与趋势。\n    若系统在运行中产"
                                                  "生错误，请转到以下网站的issue栏填写您的问题:\n    https://gitee.com/hactory/ecds");
}
void MainWindow::btn_exit()
{
    QApplication::quit();
}
